/**
 * @BaseAction.as
 * @author soda.C mail:asframe@qq.com
 * @version  1.0
 * <br>Copyright (C), 2008 soda.C
 * <br>This program is protected by copyright laws.
 * <br>Program Name:Core
 * @data 2008-6-15
 */
package com.asframe.action
{

	/**
	 * 动作基类，实现了动作接口
	 *
	 * @author soda.C
	 */
	public class BasicAction implements IAction
	{
		public static const NAME    :String = "BasicAction";
		/** 附加的额外数据 **/
		public var extra			:*;
		/** 动作类型 **/
		protected var mType			:String;
		/** 动作名称 **/
		protected var mName			:String;
//		/** 可以替换的类型数据 **/
//		protected var repList		:Array;
//		/** 代替动作 **/
//		protected var replaceRole	:IAction;			//代替动作
		/**  **/
		protected var mActor		:IActor;
		/** 默认结束的时候调用的回调函数 **/
		protected var mCallBack		:Function
		protected var mParam		:*;

		/** 是否已经启动了（防止重复调用start方法） **/
		protected var mIsStart		:Boolean;
		/** 是否已经释放的标记 **/
		protected var isDestory		:Boolean;

		public function BasicAction()
		{
			//默认类型,是可以并存的
			mType = ActionConsts.SAME;
			mName = NAME;
		}
		/**
		 * 初始化方法
		 * @param callBack 销毁前的回调函数
		 * @param param 参数
		 *
		 */
		public function initAction(callBack:Function,param:* = null):void
		{
			this.mCallBack = callBack;
			this.mParam = param;
		}
		public function setName(name:String):void
		{
			this.mName = name;
		}
		public function setType(type:String):void
		{
			this.mType = type;
		}
		public function getType():String
		{
			return mType;
		}
		public function getName():String
		{
			return mName;
		}
		/**
		 * 开始执行具体的动作逻辑，BasicAction做了一些基础处理，一般不建议子类重写。如果重写了，请调用super.start();
		 *
		 * @param actor 动作的服务对象(表演者)
		 */
		public function start(actor:IActor):void
		{
			if(mIsStart)
				throw new Error("重复调用start了" + this);

			isDestory = false;
			mIsStart = true;
			this.mActor = actor;
			//拥有公共的actor属性，则可以直接给子类赋值。这里有可能报错,其实用Type可以做出精准分析的
			if(hasOwnProperty(ActionConsts.INJECT_ACTOR))
			{
				this[ActionConsts.INJECT_ACTOR] = actor;
			}
			if(hasOwnProperty(ActionConsts.INJECT_PARAM))
			{
				this[ActionConsts.INJECT_PARAM] = mParam;
			}
			else if(hasOwnProperty(ActionConsts.INJECT_SET_PARAMS))
			{
				this[ActionConsts.INJECT_PARAM].call(this,mParam);
			}
			onStart();
		}
		/**
		 * 子类必须重写该方法
		 */
		protected function onStart():void
		{

		}
		public function destroy(o:* = null):void
		{
			//防止重复销毁引起错误
			if(isDestory)
				return ;
			isDestory = true;
			mIsStart = false;
			//手动自己从actor中清除自己
			mActor.delAction(this,false);
			onDestory();
			if(mCallBack != null)
			{
				if(mCallBack.length == 1)
					mCallBack(mActor);
				else
					mCallBack();
				mCallBack = null;
			}
			mActor = null;
		}
		protected function onDestory():void
		{

		}
//		public function isFinish():Boolean
//		{
//			return finish;
//		}
//		/**
//		 * 设置可以替换的类型
//		 */
//		public function setReplace(...args):void
//		{
//			var len:int = args.length;
//			if(len > 0)
//			{
//				for(var i:int = 0; i < len; i++)
//				{
//					repList.push(args[i]);
//				}
//			}
//		}
//		public function getReplaceType():String
//		{
//			return "";
//		}
//		/**
//		 * 动作action是否可以替换该动作
//		 * @param action:动作实例
//		 */
//		protected function isReplace(action:IAction):Boolean
//		{
//			var len:int = repList.length;
//			//查看是否在替换/临时替换列表里
//			for(var i:int = 0; i < len; i++)
//			{
//				if(action.getName() == repList[i])
//				{
//					return true;
//				}
//			}
//			return false;
//		}
	}
}
